/* libgeisyr.h - Header der Geisyr-Bibliotheken */

#ifndef LIBGEISYR_H_INCLUDED
#define LIBGEISYR_H_INCLUDED


/* Deklaration eigener Datentypen */

typedef char troomname [50];

struct tsensorlist {
	char sensorpath[100]; // Enthält Hauptknotenname und Sensorname, mit ':' getrennt
	int sensortype; //
};

struct twindowstate {
	char sensorpath[100];
	int windowopen; // 0 = zu, ungleich 0 = auf
};

struct troomstatus {
	int reserved; // 0 = frei, ungleich 0 = reserviert
	int starttime;
	int endtime;
	char person[50];
	char activity[50];
};

struct troomreservation {
	troomname roomname;
	int starttime;
	int endtime;
	char person[50];
	char activity[50];
};


/* Deklaration globaler Funktionen */

/* Grundsätzlich gilt: Der Rückgabewert der Funktionen dient der Fehlerbehandlung und ist bei fehlerfreier Ausführung
   der Funktion gleich null. Ein- und/oder Ausgabe erfolgt mit der Parameterliste. Dabei ist der weiter links stehende
   Teil der Parameterliste für die Eingabe, der weiter rechts stehende Teil für die Ausgabe zuständig.

   WICHTIG: Die Funktionen, die mit "Heap!" kommentiert sind, reservieren Speicher im Heap. Deswegen muss die entsprechende
   Pointer-Variable nach Aufruf der Funktion irgendwann mit "free" aufgerufen werden. */


extern int GetNodeSensorList(char* nodename, struct tsensorlist** sensorlist, int* arraylength); //! Heap!
extern int GetAllSensorList(struct tsensorlist** sensorlist, int* arraylength); //! Heap!

/* Diese Funktionen liefern den Sensorpfad (Hauptknotenname und Sensorname, z.B. "wohnzimmer:fenster2") und den Sensortyp von
   Sensoren. "GetNodeSensorList" betrifft alle Sensoren des angegebenen Hauptknotens, "GetAllSensorList" die Sensoren
   aller Hauptknoten. */


extern int GetTempSensorValue(char* sensorpath, int unit, double* temp);

/* Diese Funktion liefert die Temperatur eines angegebenen Temperatursensors. Die int-Variable "unit" bestimmt die Einheit der
   zurückgegebenen Temperatur. 0: °C, 1: °F, 2: K */


extern int GetWindowSensorState(char* sensorpath, int* windowopen);
extern int GetAllWindowSensorState(struct twindowstate** windowstatelist, int* arraylenth); //! Heap!

/* Diese Funktionen liefern die Information, ob ein Fenster geschlossen oder geöffnet ist. Dabei bedeuted 0 = zu und
   ungleich 0 = auf. "GetWindowSensorState" betrifft einen bestimmten Sensor, "GetAllWindowSensorState" die Fenstersensoren
   aller Hauptknoten (zum Test, ob alle Fenster zu sind). */


extern int GetBrightness(char* sensorpath, double* brightness);

/* Diese Funktion liefert den Wert der Umgebungshelligkeit eines Hauptknotens */


extern int GetRoomStatus(char* roomname, struct troomstatus* roomstatus);
extern int GetAlternativeRooms(char* roomname, int roomquantity, troomname** altroomlist); //! Heap!

/* "GetRoomStatus" liefert Informationen zur Raumbelegung eines angegebenen Raumes und der darin stattfindenden Aktivität.
   "GetAlternativeRooms" liefert eine "int roomquantity" lange Liste mit anderen, ähnlichen (Größe, Ausstattung, ...) Räumen,
   falls der angegebene Raum belegt ist. */


extern int SetRoomReservation(struct troomreservation* roomreservation);

/* Nimmt die Adresse einer struct-Variablen entgegen, die die Information für genau eine Raumresevierung enthält. */


#endif // LIBGEISYR_H_INCLUDED

